package dao

import (
	"go-admin1/admin/system/model"
	"go-admin1/internal/infrastructure/database"
	"go-admin1/internal/infrastructure/logger"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

// SysConfigDao 配置参数数据访问接口
type SysConfigDao interface {
	Create(config *model.SysConfig) error
	GetByID(id int64) (*model.SysConfig, error)
	GetByKey(configKey string) (*model.SysConfig, error)
	Update(config *model.SysConfig) error
	Delete(id int64) error
	List(page, pageSize int) ([]*model.SysConfig, int64, error)
	ListAll() ([]*model.SysConfig, error)
}

type sysConfigDao struct {
	db *gorm.DB
}

// NewSysConfigDao 创建配置参数数据访问实例
func NewSysConfigDao() SysConfigDao {
	return &sysConfigDao{
		db: database.GetDB(),
	}
}

func (c *sysConfigDao) Create(config *model.SysConfig) error {
	logger.Info("创建配置参数", zap.Int64("config_id", config.ConfigID))
	return c.db.Create(config).Error
}

func (c *sysConfigDao) GetByID(id int64) (*model.SysConfig, error) {
	logger.Debug("根据ID获取配置参数", zap.Int64("config_id", id))
	var config model.SysConfig
	err := c.db.Where("config_id = ?", id).First(&config).Error
	return &config, err
}

func (c *sysConfigDao) GetByKey(configKey string) (*model.SysConfig, error) {
	logger.Debug("根据键获取配置参数", zap.String("config_key", configKey))
	var config model.SysConfig
	err := c.db.Where("config_key = ?", configKey).First(&config).Error
	return &config, err
}

func (c *sysConfigDao) Update(config *model.SysConfig) error {
	logger.Info("更新配置参数", zap.Int64("config_id", config.ConfigID))
	return c.db.Save(config).Error
}

func (c *sysConfigDao) Delete(id int64) error {
	logger.Info("删除配置参数", zap.Int64("config_id", id))
	return c.db.Where("config_id = ?", id).Delete(&model.SysConfig{}).Error
}

func (c *sysConfigDao) List(page, pageSize int) ([]*model.SysConfig, int64, error) {
	logger.Debug("获取配置参数列表", zap.Int("page", page), zap.Int("page_size", pageSize))
	var configs []*model.SysConfig
	var total int64

	offset := (page - 1) * pageSize
	db := c.db.Model(&model.SysConfig{})

	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	if err := db.Offset(offset).Limit(pageSize).Find(&configs).Error; err != nil {
		return nil, 0, err
	}

	return configs, total, nil
}

func (c *sysConfigDao) ListAll() ([]*model.SysConfig, error) {
	logger.Debug("获取所有配置参数列表")
	var configs []*model.SysConfig
	err := c.db.Find(&configs).Error
	return configs, err
}
